import Request, {type HttpRequestConfig} from 'luch-request'
import {useUserStore} from '@/stores'

const http = new Request()

// 从env中获取请求地址
const baseURL = import.meta.env.VITE_BASE_URL

const userStore = useUserStore()

// 自定义选项
const options = {
    // 显示操作成功消息 默认不显示
    showSuccess: false,
    // 成功提醒 默认使用后端返回值
    successMsg: '',
    // 显示失败消息 默认显示
    showError: true,
    // 失败提醒 默认使用后端返回信息
    errorMsg: '',
    // 显示请求时loading模态框 默认显示
    showLoading: true,
    // loading提醒文字
    loadingMsg: '加载中',
    // 需要授权才能请求 默认放开
    auth: false,
    // ...
};

// Loading全局实例
let LoadingInstance = {
    target: null,
    count: 0,
};

/**
 * 关闭loading
 */
function closeLoading() {
    if (LoadingInstance.count > 0) LoadingInstance.count--;
    if (LoadingInstance.count === 0) uni.hideLoading();
}

// 全局配置修改setConfig
http.setConfig((config) => {
    config.baseURL = baseURL
    config.header = {
        ...config.header,
        Accept: 'text/json',
        'Content-Type': 'application/json;charset=UTF-8',
        server: '1',
    }
    config.custom = {
        ...options,
        ...config.custom,
    }
    return config
})

// 拦截器
// 在请求之前拦截
http.interceptors.request.use((config) => { // 可使用async await 做异步操作
    config.header = {
        ...config.header,
    }
    // 获取token
    const userToken = userStore.userToken
    if (userToken) {
        config.header['ba-user-token'] = userToken
    }
    // 需要验证且没有token
    if (config.custom!.auth && !userToken) {
        // 跳转登录页
        uni.navigateTo({
            url: '/pages/login/index',
        })
        return Promise.reject(config)
    }
    if (config.custom!.showLoading) {
        LoadingInstance.count++;
        LoadingInstance.count === 1 &&
        uni.showLoading({
            title: config.custom!.loadingMsg,
            mask: true,
            fail: () => {
                uni.hideLoading();
            },
        });
    }
    return config
}, config => { // 可使用async await 做异步操作
    return Promise.reject(config)
})

// 在请求之后拦截
http.interceptors.response.use((response) => { /* 对响应成功做点什么 可使用async await 做异步操作*/
    //设置 userToken
    if(response.header?.token){
        userStore.setUserToken(response.header.token)
    }
    response.config.custom!.showLoading && closeLoading();

    if(response.data.code !== 1){
        if(response.config.custom!.showError){
            uni.showToast({
                title: response.data.msg||'服务器开小差啦,请稍后再试~',
                icon: 'none',
                mask: true,
            })
            return Promise.resolve(response.data);
        }
        // 报错返回 不走 .then
        return Promise.reject(response);
    }
    if(response.config.custom!.showSuccess){
        uni.showToast({
            title: response.config.custom!.successMsg ||response.data.msg||'操作成功',
            icon: 'none',
        })
    }
    console.log(response)
    return Promise.resolve(response.data);
}, (error) => { /*  对响应错误做点什么 （statusCode !== 200）*/
    console.log(error)
    let errorMessage = '网络请求出错';
    if (error !== undefined) {
        switch (error.statusCode) {
            case 400:
                errorMessage = '请求错误';
                break;
            case 401:
                errorMessage = '您的登陆已过期';
                break;
        }
    }

    if (error && error.config) {
        if (error.config.custom!.showError === false) {
            uni.showToast({
                title: error.data?.msg || errorMessage,
                icon: 'none',
                mask: true,
            });
        }
        error.config.custom!.showLoading && closeLoading();
    }

    return Promise.reject(error)
})

const request = (config:HttpRequestConfig) => {
    return http.middleware(config);
}

export default request;